package com.weihua.service;

import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.Collection;

/**
 * 业务处理接口
 * @author wcl
 */
public interface BaseService<B> {

    /**
     * 插入一条记录
     * @param bo    实体对象
     * @return  是否成功
     */
    boolean save(B bo);

    /**
     * 批量插入
     * @param boList    实体对象集合
     * @param batchSize 批次数量
     * @return  是否成功
     */
    boolean saveBatch(Collection<B> boList, int batchSize);

    /**
     * 批量插入（批次数量：1000）
     * @param boList    实体对象集合
     * @return  是否成功
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean saveBatch(Collection<B> boList) {
        return this.saveBatch(boList, 1000);
    }

    /**
     * 批量保存或插入
     * @param boList    实体对象集合
     * @param batchSize 批次数量
     * @return  是否成功
     */
    boolean saveOrUpdateBatch(Collection<B> boList, int batchSize);

    /**
     * 批量保存或插入（批次数量：1000）
     * @param boList    实体对象集合
     * @return  是否成功
     */
    @Transactional(rollbackFor = Exception.class)
    default boolean saveOrUpdateBatch(Collection<B> boList) {
        return this.saveOrUpdateBatch(boList, 1000);
    }

    /**
     * 删除数据
     * @param id    实体对象主键
     * @return  是否成功
     */
    boolean removeById(Serializable id);

    /**
     * 批量删除数据
     * @param idList    实体对象主键集合
     * @return  是否成功
     */
    boolean removeByIds(Collection<? extends Serializable> idList);

    /**
     * 修改数据
     * @param bo    实体对象
     * @return  是否成功
     */
    boolean updateById(B bo);

    /**
     * 批量更新（实体对象主键）
     * @param boList    实体对象
     * @param batchSize 批次数量
     * @return  是否成功
     */
    boolean updateBatchById(Collection<B> boList, int batchSize);

    /**
     * 批量更新（实体对象主键）
     * @param boList    实体对象
     * @return  是否成功
     */
    default boolean updateBatchById(Collection<B> boList) {
        return this.updateBatchById(boList, 1000);
    }

    /**
     * 保存或更新数据. 主键不为空，则更新；否则，添加数据.
     * @param bo    实体对象
     * @return  是否成功
     */
    boolean saveOrUpdate(B bo);

    /**
     * 查询单条数据
     * @param id    实体对象主键
     * @return  是否成功
     */
    B getById(Serializable id);

    /**
     * 查询数据集合
     * @param idList    实体主键集合
     * @return  数据集合
     */
    Collection<B> listByIds(Collection<? extends Serializable> idList);

}
